﻿Imports System.Text.RegularExpressions
Imports WSEntidades

Public Class csUtilsAddendaComa
    Private cadenaComercial As String
    Public Function ProcesaConfig(ByVal currentrow As String(), ByRef Resp As List(Of RespuestaPremium))
        Try
            If (currentrow.Length = 5 And currentrow(0) = "13") Then
                If (currentrow(1) = "CVEADD") Then
                    If (currentrow(2) <> "" And currentrow(2) = "COMA") Then
                        cadenaComercial = currentrow(2)
                    Else
                        ValidaCFDi.AgregaRespuesta("13", 3, "El contenido del documento TXT no es correcto. Clave Incorrecta.", Resp)
                    End If
                Else
                    ValidaCFDi.AgregaRespuesta("13", 2, "El contenido del documento TXT no es correcto. La seccion 13 no contiene el indicador CVEADD", Resp)
                End If
            Else
                ValidaCFDi.AgregaRespuesta("13", 0, "El contenido del documento TXT no es correcto. La seccion 13 no corresponde con el formato especificado", Resp)
            End If
            Return True
        Catch ex As Exception
            ValidaCFDi.AgregaRespuesta("13", 1, ex.Message, Resp)
            Return False
        End Try
    End Function
    Public Function ProcesaEncabezado(ByVal currentrow As String(), ByVal comprobante As Comprobante, _
                                      ByRef Resp As List(Of RespuestaPremium), ByVal tipoCFD As String, _
                                      ByRef add As Coma.ADD_HEADER)
        Dim mensaje As String = ""
        Try
            If (currentrow.Length = 6) Then
                If (currentrow(2).Trim <> "") Then
                    If (currentrow(2).Trim.Length > 30) Then
                        add.RECEIPT_NUMBER = currentrow(2).Trim.Substring(0, 30)
                    Else
                        add.RECEIPT_NUMBER = currentrow(2).Trim
                    End If
                Else
                    mensaje = mensaje & "El dato RECEIPT_NUMBER es requerido. Addenda Coma sección 13." & vbCrLf
                End If

                If (currentrow(3).Trim <> "") Then
                    If (currentrow(3).Trim.Length > 100) Then
                        mensaje = mensaje & "El dato EMAIL debe ser de longitud maxima de 100. Addenda Coma sección 13." & vbCrLf
                    Else
                        If (valida_Correo(currentrow(3).Trim)) Then
                            add.EMAIL = currentrow(3).Trim
                        Else
                            mensaje = mensaje & "El dato EMAIL tiene una estructura incorrecta. Addenda Coma sección 13." & vbCrLf
                        End If
                    End If
                End If

                Select Case tipoCFD
                    Case "FA"
                        add.INVOICE_TYPE = 1
                    Case "CR"
                        add.INVOICE_TYPE = 2
                    Case "CA"
                        add.INVOICE_TYPE = 3
                    Case Else
                        mensaje = mensaje & "El dato INVOICE_TYPE tiene un valor incorrecto de acuerdo a las especificaciones de la addenda. Addenda Coma sección 13." & vbCrLf
                End Select

                If (currentrow(4).Trim <> "") Then
                    If (currentrow(4).Trim.Length > 20) Then
                        mensaje = mensaje & "El dato PO_NUMBER debe ser de longitud maxima 20. Addenda Coma sección 13." & vbCrLf
                    Else
                        add.PO_NUMBER = currentrow(4).Trim
                    End If
                Else
                    mensaje = mensaje & "El dato PO_NUMBER es requerido. Addenda Coma sección 13." & vbCrLf
                End If

                add.INVOICE_NUMBER = "Temp"
                add.INVOICE_CURRENCY_CODE = comprobante.Moneda
                If (comprobante.TipoCambio <> "") Then
                    add.EXCHANGE_RATE = comprobante.TipoCambio
                    add.EXCHANGE_RATESpecified = True
                End If
                If (mensaje <> "") Then
                    ValidaCFDi.AgregaRespuesta("13", 0, mensaje, Resp)
                    Return False
                Else
                    Return True
                End If
            Else
                ValidaCFDi.AgregaRespuesta("13", 0, "El contenido del documento TXT no es correcto,longitud incorrecta para sección ENCABEZADO. Addenda Coma Sección 13.", Resp)
                Return False
            End If
        Catch ex As Exception
            ValidaCFDi.AgregaRespuesta("13", 0, ex.Message, Resp)
            Return False
        End Try
    End Function
    Public Function ProcesaDetalle(ByVal currentrow As String(), ByVal comprobante As Comprobante, _
                                      ByRef Resp As List(Of RespuestaPremium), ByRef add As Coma.ADD_HEADER, ByVal n As Integer)
        Dim mensaje As String = ""
        Try
            If (currentrow.Length = 10) Then
                If (add.DETAILS Is Nothing) Then
                    add.DETAILS = New Coma.t_Details() {New Coma.t_Details()}
                    add.DETAILS(0).UNIT_PRICE = comprobante.Conceptos(n).valorUnitario
                    If (comprobante.Conceptos(n).noIdentificacion <> "") Then
                        add.DETAILS(0).VENDOR_ITEM_NUMBER = comprobante.Conceptos(n).noIdentificacion
                    Else
                        mensaje = mensaje & "El dato VENDOR_ITEM_NUMBER es requerido por lo que debe indicar una clave de producto en sus partidas." & vbCrLf
                    End If
                    If (currentrow(2).Trim <> "") Then
                        add.DETAILS(0).LINE_NUMBER = currentrow(2).Trim
                    Else
                        mensaje = mensaje & "El dato LINE_NUMBER es requerido. Addenda Coma Sección 13." & vbCrLf
                    End If
                    add.DETAILS(0).QUANTITY_INVOICED = comprobante.Conceptos(n).cantidad
                    If (currentrow(3).Trim <> "") Then
                        add.DETAILS(0).MISCELLANEOUS = currentrow(3).Trim
                    Else
                        mensaje = mensaje & "El dato MISCELLANEOUS es requerido. Addenda Coma Sección 13." & vbCrLf
                    End If
                    If (currentrow(4).Trim <> "" And currentrow(5).Trim <> "" And currentrow(6).Trim <> "") Then
                        add.DETAILS(0).TAXES = New Coma.t_Tax() {New Coma.t_Tax()}
                        Try
                            add.DETAILS(0).TAXES(0).TAX_PERCENT = CDec(currentrow(4).Trim)
                            add.DETAILS(0).TAXES(0).TAX_PERCENTSpecified = True
                        Catch ex As Exception
                            mensaje = mensaje & "El dato TAX_PERCENT(5) es incorrecto. " & ex.Message & " Addenda Coma Sección 13." & vbCrLf
                        End Try
                        If (currentrow(5).Trim.Length > 12) Then
                            mensaje = mensaje & "El dato TAX_CODE (6) debe ser de longitud maxima 12. Addenda Coma Sección 13." & vbCrLf
                        Else
                            add.DETAILS(0).TAXES(0).TAX_CODE = currentrow(5).Trim
                        End If
                        Try
                            add.DETAILS(0).TAXES(0).TAX_AMOUNT = CDec(currentrow(6).Trim)
                            add.DETAILS(0).TAXES(0).TAX_AMOUNTSpecified = True
                        Catch ex As Exception
                            mensaje = mensaje & "El dato TAX_AMOUNT (7) es incorrecto. " & ex.Message & " Addenda Coma Sección 13." & vbCrLf
                        End Try
                    Else
                        mensaje = mensaje & "Debe indicar al menos un nodo TAX. Addenda Coma Sección 13." & vbCrLf
                    End If
                    If (currentrow(7).Trim <> "" And currentrow(8).Trim <> "" And currentrow(9).Trim <> "") Then
                        ReDim Preserve add.DETAILS(0).TAXES(add.DETAILS(0).TAXES.Length)
                        add.DETAILS(0).TAXES(add.DETAILS(0).TAXES.Length - 1) = New Coma.t_Tax()
                        Try
                            add.DETAILS(0).TAXES(add.DETAILS(0).TAXES.Length - 1).TAX_PERCENT = CDec(currentrow(7).Trim)
                            add.DETAILS(0).TAXES(add.DETAILS(0).TAXES.Length - 1).TAX_PERCENTSpecified = True
                        Catch ex As Exception
                            mensaje = mensaje & "El dato TAX_PERCENT(8) es incorrecto. " & ex.Message & " Addenda Coma Sección 13." & vbCrLf
                        End Try
                        If (currentrow(8).Trim.Length > 12) Then
                            mensaje = mensaje & "El dato TAX_CODE (9) debe ser de longitud maxima 12. Addenda Coma Sección 13." & vbCrLf
                        Else
                            add.DETAILS(0).TAXES(add.DETAILS(0).TAXES.Length - 1).TAX_CODE = currentrow(8).Trim
                        End If
                        Try
                            add.DETAILS(0).TAXES(add.DETAILS(0).TAXES.Length - 1).TAX_AMOUNT = CDec(currentrow(9).Trim)
                            add.DETAILS(0).TAXES(add.DETAILS(0).TAXES.Length - 1).TAX_AMOUNTSpecified = True
                        Catch ex As Exception
                            mensaje = mensaje & "El dato TAX_AMOUNT (10) es incorrecto. " & ex.Message & " Addenda Coma Sección 13." & vbCrLf
                        End Try
                    ElseIf (currentrow(7).Trim <> "" Or currentrow(8).Trim <> "" Or currentrow(9).Trim <> "") Then
                        mensaje = mensaje & "Debe indicar todos los elementos del nodo TAX. Addenda Coma Sección 13." & vbCrLf
                    End If
                Else
                    ReDim Preserve add.DETAILS(add.DETAILS.Length)
                    add.DETAILS(add.DETAILS.Length - 1) = New Coma.t_Details()
                    add.DETAILS(add.DETAILS.Length - 1).UNIT_PRICE = comprobante.Conceptos(n).valorUnitario
                    If (comprobante.Conceptos(n).noIdentificacion <> "") Then
                        add.DETAILS(add.DETAILS.Length - 1).VENDOR_ITEM_NUMBER = comprobante.Conceptos(n).noIdentificacion
                    Else
                        mensaje = mensaje & "El dato VENDOR_ITEM_NUMBER es requerido por lo que debe indicar una clave de producto en sus partidas." & vbCrLf
                    End If
                    If (currentrow(2).Trim <> "") Then
                        add.DETAILS(add.DETAILS.Length - 1).LINE_NUMBER = currentrow(2).Trim
                    Else
                        mensaje = mensaje & "El dato LINE_NUMBER es requerido. Addenda Coma Sección 13." & vbCrLf
                    End If
                    add.DETAILS(add.DETAILS.Length - 1).QUANTITY_INVOICED = comprobante.Conceptos(n).cantidad
                    If (currentrow(3).Trim <> "") Then
                        add.DETAILS(add.DETAILS.Length - 1).MISCELLANEOUS = currentrow(3).Trim
                    Else
                        mensaje = mensaje & "El dato MISCELLANEOUS es requerido. Addenda Coma Sección 13." & vbCrLf
                    End If
                    If (currentrow(4).Trim <> "" And currentrow(5).Trim <> "" And currentrow(6).Trim <> "") Then
                        add.DETAILS(add.DETAILS.Length - 1).TAXES = New Coma.t_Tax() {New Coma.t_Tax()}
                        Try
                            add.DETAILS(add.DETAILS.Length - 1).TAXES(0).TAX_PERCENT = CDec(currentrow(4).Trim)
                            add.DETAILS(add.DETAILS.Length - 1).TAXES(0).TAX_PERCENTSpecified = True
                        Catch ex As Exception
                            mensaje = mensaje & "El dato TAX_PERCENT(5) es incorrecto. " & ex.Message & " Addenda Coma Sección 13." & vbCrLf
                        End Try
                        If (currentrow(5).Trim.Length > 12) Then
                            mensaje = mensaje & "El dato TAX_CODE (6) debe ser de longitud maxima 12. Addenda Coma Sección 13." & vbCrLf
                        Else
                            add.DETAILS(add.DETAILS.Length - 1).TAXES(0).TAX_CODE = currentrow(5).Trim
                        End If
                        Try
                            add.DETAILS(add.DETAILS.Length - 1).TAXES(0).TAX_AMOUNT = CDec(currentrow(6).Trim)
                            add.DETAILS(add.DETAILS.Length - 1).TAXES(0).TAX_AMOUNTSpecified = True
                        Catch ex As Exception
                            mensaje = mensaje & "El dato TAX_AMOUNT (7) es incorrecto. " & ex.Message & " Addenda Coma Sección 13." & vbCrLf
                        End Try
                    Else
                        mensaje = mensaje & "Debe indicar al menos un nodo TAX. Addenda Coma Sección 13." & vbCrLf
                    End If
                    If (currentrow(7).Trim <> "" And currentrow(8).Trim <> "" And currentrow(9).Trim <> "") Then
                        ReDim Preserve add.DETAILS(add.DETAILS.Length - 1).TAXES(add.DETAILS(add.DETAILS.Length - 1).TAXES.Length)
                        add.DETAILS(add.DETAILS.Length - 1).TAXES(add.DETAILS(add.DETAILS.Length - 1).TAXES.Length - 1) = New Coma.t_Tax()
                        Try
                            add.DETAILS(add.DETAILS.Length - 1).TAXES(add.DETAILS(add.DETAILS.Length - 1).TAXES.Length - 1).TAX_PERCENT = CDec(currentrow(7).Trim)
                            add.DETAILS(add.DETAILS.Length - 1).TAXES(add.DETAILS(add.DETAILS.Length - 1).TAXES.Length - 1).TAX_PERCENTSpecified = True
                        Catch ex As Exception
                            mensaje = mensaje & "El dato TAX_PERCENT(8) es incorrecto. " & ex.Message & " Addenda Coma Sección 13." & vbCrLf
                        End Try
                        If (currentrow(8).Trim.Length > 12) Then
                            mensaje = mensaje & "El dato TAX_CODE (9) debe ser de longitud maxima 12. Addenda Coma Sección 13." & vbCrLf
                        Else
                            add.DETAILS(add.DETAILS.Length - 1).TAXES(add.DETAILS(add.DETAILS.Length - 1).TAXES.Length - 1).TAX_CODE = currentrow(8).Trim
                        End If
                        Try
                            add.DETAILS(add.DETAILS.Length - 1).TAXES(add.DETAILS(add.DETAILS.Length - 1).TAXES.Length - 1).TAX_AMOUNT = CDec(currentrow(9).Trim)
                            add.DETAILS(add.DETAILS.Length - 1).TAXES(add.DETAILS(add.DETAILS.Length - 1).TAXES.Length - 1).TAX_AMOUNTSpecified = True
                        Catch ex As Exception
                            mensaje = mensaje & "El dato TAX_AMOUNT (10) es incorrecto. " & ex.Message & " Addenda Coma Sección 13." & vbCrLf
                        End Try
                    ElseIf (currentrow(7).Trim <> "" Or currentrow(8).Trim <> "" Or currentrow(9).Trim <> "") Then
                        mensaje = mensaje & "Debe indicar todos los elementos del nodo TAX. Addenda Coma Sección 13." & vbCrLf
                    End If
                End If

                If (mensaje <> "") Then
                    ValidaCFDi.AgregaRespuesta("13", 0, mensaje, Resp)
                    Return False
                Else
                    Return True
                End If
            Else
                ValidaCFDi.AgregaRespuesta("13", 0, "El contenido del documento TXT no es correcto,longitud incorrecta para sección DETAIL Addenda Coma Sección 13.", Resp)
                Return False
            End If

        Catch ex As Exception
            ValidaCFDi.AgregaRespuesta("13", 0, ex.Message, Resp)
            Return False
        End Try
    End Function

    Public Function valida_Correo(ByVal sCorreo As String) As Boolean
        Dim re As Regex = New Regex( _
                            "^[a-zA-Z][\w\.-]*[a-zA-Z0-9]@" & _
                            "[a-zA-Z0-9][\w\.-]*[a-zA-Z0-9]\." & _
                            "[a-zA-Z][a-zA-Z\.]*[a-zA-Z]$", _
                            RegexOptions.IgnoreCase)
        Dim m As Match = re.Match(sCorreo)
        If m.Captures.Count = 0 Then
            Return False
        Else
            Return True
        End If
    End Function
End Class
